#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e6+5;
int n,c,a[N],b[N],cnt;
struct node{
	int mn,tag1,tag2,tag3;
}t[N<<2];
#define ls (k<<1)
#define rs (k<<1|1)
#define pushup(k) (t[k].mn = min(t[ls].mn,t[rs].mn))
inline void add1(int k,int v){t[k].mn+=v,t[k].tag1+=v;}
inline void add2(int k,int l,int r,int v){t[k].mn+=v*b[l],t[k].tag2+=v;}
inline void cover(int k,int v){t[k].mn = t[k].tag3 = v,t[k].tag1 = t[k].tag2 = 0;}
inline void down(int k,int l,int r,int mid)
{
	if(t[k].tag3!=-1)
	{
		cover(ls,t[k].tag3),cover(rs,t[k].tag3);
		t[k].tag3 = -1;
	}
	if(t[k].tag1)
	{
		add1(ls,t[k].tag1),add1(rs,t[k].tag1);
		t[k].tag1 = 0;
	}
	if(t[k].tag2)
	{
		add2(ls,l,mid,t[k].tag2),add2(rs,mid+1,r,t[k].tag2);
		t[k].tag2 = 0;
	}
}
void build(int k,int l,int r)
{
	t[k].mn = t[k].tag1 = t[k].tag2 = 0,t[k].tag3 = -1;
	if(l==r) return;
	int mid = (l+r)/2;
	build(ls,l,mid),build(rs,mid+1,r);
}
void change1(int k,int l,int r,int x,int y,int v)
{
	if(l>y||r<x) return;
	if(l>=x&&r<=y) return add1(k,v),void();
	int mid = (l+r)/2;
	down(k,l,r,mid);
	change1(ls,l,mid,x,y,v),change1(rs,mid+1,r,x,y,v);
	pushup(k);
}
void change2(int k,int l,int r,int x,int y,int v)
{
	if(l>y||r<x) return;
	if(l>=x&&r<=y) return add2(k,l,r,v),void();
	int mid = (l+r)/2;
	down(k,l,r,mid);
	change2(ls,l,mid,x,y,v),change2(rs,mid+1,r,x,y,v);
	pushup(k);
}
void change3(int k,int l,int r,int x,int y,int v)
{
	if(l>y||r<x) return;
	if(l>=x&&r<=y) return cover(k,v),void();
	int mid = (l+r)/2;
	down(k,l,r,mid);
	change3(ls,l,mid,x,y,v),change3(rs,mid+1,r,x,y,v);
	pushup(k);
}
int ask(int k,int l,int r,int v)
{
	if(l==r) return l+(t[k].mn<v);
	int mid = (l+r)/2;
	down(k,l,r,mid);
	if(t[rs].mn>=v) return ask(ls,l,mid,v);
	else return ask(rs,mid+1,r,v); 
}
int askp(int k,int l,int r,int x)
{
	if(l==r) return t[k].mn;
	int mid = (l+r)/2;
	down(k,l,r,mid);
	if(mid>=x) return askp(ls,l,mid,x);
	else return askp(rs,mid+1,r,x);
}
signed main()
{
	freopen("minimize.in","r",stdin);
	freopen("minimize.out","w",stdout);
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>n>>c;
	for(int i = 1;i<=n;i++)
		cin>>a[i],b[++cnt] = a[i];
	sort(b+1,b+cnt+1),cnt = unique(b+1,b+cnt+1)-b-1;
	build(1,1,cnt);
	for(int i = 1;i<=n;i++)
	{
		a[i] = lower_bound(b+1,b+cnt+1,a[i])-b;
		change1(1,1,cnt,a[i],cnt,-b[a[i]]);
		change2(1,1,cnt,a[i],cnt,1);
		int now = askp(1,1,cnt,a[i]);
		int p = ask(1,1,cnt,now-c);
		change1(1,1,cnt,1,min(p-1,a[i]-1),c);
		change3(1,1,cnt,p,a[i],now);
	}
	cout<<t[1].mn;
	return 0;
}

